/*!
 * # 数据实体类:
 *  Notification - 通知
 * 
 * # 描述:
 *  一条已经发送或接收到的通知消息。
 *  
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using Pittypat;

namespace Waln.Notifying.Service.Data
{
	/// <summary>
	/// 通知。
	/// </summary>
	/// <remarks>
	/// 一条已经发送或接收到的通知消息。
	/// </remarks>
	public sealed class Notification : global::Pittypat.DataModel
	{
		#region 构造函数

		/// <summary>
		/// 初始化 Notification 类的一个新实例。
		/// </summary>
		public Notification()
		{
			// Id
			this.Id = null;
			// 发送用户的 Id
			this.SenderId = null;
			// 接收用户的 Id
			this.ReceiverId = null;
			// 接收人名称
			this.ReceiverName = null;
			// 接收人头像路径
			this.ReceiverFaceUrl = null;
			// 接收时间
			this.ReceiveTime = null;
			// 阅读时间
			this.ReadTime = null;
			// 紧急程度
			this.Urgency = null;
			// 分组
			this.Group = null;
			// 通知标题
			this.Title = null;
			// 通知消息摘要
			this.Summary = null;
			// 通知正文内容
			this.Body = null;
			// 正文类型代码
			this.BodyType = null;
			// 目标功能路径
			this.FuncUrl = null;
			// 引用数据的类型
			this.RefDataType = null;
			// 引用数据键值
			this.RefDataKey = null;
			// 附件 Id
			this.AttachmentId = null;
		}

		#endregion

		#region 属性

		/// <summary>
		/// 获取或者设置Id。
		/// </summary>
		/// <remarks>
		/// 消息的 Id。
		/// </remarks>
		public @uuid? Id { get; set; }

		/// <summary>
		/// 获取或者设置发送用户的 Id。
		/// </summary>
		/// <remarks>
		/// 发送消息的用户的 Id，如果是系统消息，则为 null。
		/// </remarks>
		public @uuid? SenderId { get; set; }

		/// <summary>
		/// 获取或者设置接收用户的 Id。
		/// </summary>
		/// <remarks>
		/// 接收消息的用户的 Id，如果是广播消息，则为 null。
		/// </remarks>
		public @uuid? ReceiverId { get; set; }

		/// <summary>
		/// 获取或者设置接收人名称。
		/// </summary>
		/// <remarks>
		/// 接收人的名称。
		/// </remarks>
		public @string? ReceiverName { get; set; }

		/// <summary>
		/// 获取或者设置接收人头像路径。
		/// </summary>
		/// <remarks>
		/// 接收人头像文件的路径。
		/// </remarks>
		public @string? ReceiverFaceUrl { get; set; }

		/// <summary>
		/// 获取或者设置接收时间。
		/// </summary>
		/// <remarks>
		/// 消息的接收时间。
		/// </remarks>
		public @datetime? ReceiveTime { get; set; }

		/// <summary>
		/// 获取或者设置阅读时间。
		/// </summary>
		/// <remarks>
		/// 接收人阅读通知的时间，如果尚未阅读，为 null。
		/// </remarks>
		public @datetime? ReadTime { get; set; }

		/// <summary>
		/// 获取或者设置紧急程度。
		/// </summary>
		/// <remarks>
		/// 通知的紧急程度代码：1-常规，2-紧急，4-特急。默认为常规（1）。
		/// </remarks>
		public @int8? Urgency { get; set; }

		/// <summary>
		/// 获取或者设置分组。
		/// </summary>
		/// <remarks>
		/// 通知隶属的分组。
		/// </remarks>
		public @string? Group { get; set; }

		/// <summary>
		/// 获取或者设置通知标题。
		/// </summary>
		/// <remarks>
		/// 通知的标题。
		/// </remarks>
		public @string? Title { get; set; }

		/// <summary>
		/// 获取或者设置通知消息摘要。
		/// </summary>
		/// <remarks>
		/// 对通知消息正文的摘要信息。
		/// </remarks>
		public @string? Summary { get; set; }

		/// <summary>
		/// 获取或者设置通知正文内容。
		/// </summary>
		/// <remarks>
		/// 通知的完整正文内容。
		/// </remarks>
		public @string? Body { get; set; }

		/// <summary>
		/// 获取或者设置正文类型代码。
		/// </summary>
		/// <remarks>
		/// 消息正文类型代码：1-纯文本，2-HTML。
		/// </remarks>
		public @int8? BodyType { get; set; }

		/// <summary>
		/// 获取或者设置目标功能路径。
		/// </summary>
		/// <remarks>
		/// 点击消息时要进入的路径。
		/// </remarks>
		public @string? FuncUrl { get; set; }

		/// <summary>
		/// 获取或者设置引用数据的类型。
		/// </summary>
		/// <remarks>
		/// 如果此消息来自某业务功能，则可能引用某业务数据，此属性定义业务数据的类型。
		/// </remarks>
		public @string? RefDataType { get; set; }

		/// <summary>
		/// 获取或者设置引用数据键值。
		/// </summary>
		/// <remarks>
		/// 消息引用数据的键值。
		/// </remarks>
		public @string? RefDataKey { get; set; }

		/// <summary>
		/// 获取或者设置附件 Id。
		/// </summary>
		/// <remarks>
		/// 通知消息的附件文件的数目。
		/// </remarks>
		public @uuid? AttachmentId { get; set; }

		#endregion

		#region 方法

		/// <summary>
		/// 从一个 DbDataReader 中读取此对象。
		/// </summary>
		/// <param name="reader">包含对象数据的 DbDataReader 对象。</param>
		/// <exception cref="global::System.ArgumentNullException">reader 是 null。</exception>
		public override void Read(global::System.Data.Common.DbDataReader reader)
		{
			if (reader == null)
			{
				throw new global::System.ArgumentNullException("reader");
			}

			// Id
			this.Id = reader.GetValue<@uuid>("Id", defaultValue: this.Id);

			// 发送用户的 Id
			this.SenderId = reader.GetValue<@uuid>("SenderId", defaultValue: this.SenderId);

			// 接收用户的 Id
			this.ReceiverId = reader.GetValue<@uuid>("ReceiverId", defaultValue: this.ReceiverId);

			// 接收人名称
			this.ReceiverName = reader.GetValue<@string>("ReceiverName", defaultValue: this.ReceiverName);

			// 接收人头像路径
			this.ReceiverFaceUrl = reader.GetValue<@string>("ReceiverFaceUrl", defaultValue: this.ReceiverFaceUrl);

			// 接收时间
			this.ReceiveTime = reader.GetValue<@datetime>("ReceiveTime", defaultValue: this.ReceiveTime);

			// 阅读时间
			this.ReadTime = reader.GetValue<@datetime>("ReadTime", defaultValue: this.ReadTime);

			// 紧急程度
			this.Urgency = reader.GetValue<@int8>("Urgency", defaultValue: this.Urgency);

			// 分组
			this.Group = reader.GetValue<@string>("Group", defaultValue: this.Group);

			// 通知标题
			this.Title = reader.GetValue<@string>("Title", defaultValue: this.Title);

			// 通知消息摘要
			this.Summary = reader.GetValue<@string>("Summary", defaultValue: this.Summary);

			// 通知正文内容
			this.Body = reader.GetValue<@string>("Body", defaultValue: this.Body);

			// 正文类型代码
			this.BodyType = reader.GetValue<@int8>("BodyType", defaultValue: this.BodyType);

			// 目标功能路径
			this.FuncUrl = reader.GetValue<@string>("FuncUrl", defaultValue: this.FuncUrl);

			// 引用数据的类型
			this.RefDataType = reader.GetValue<@string>("RefDataType", defaultValue: this.RefDataType);

			// 引用数据键值
			this.RefDataKey = reader.GetValue<@string>("RefDataKey", defaultValue: this.RefDataKey);

			// 附件 Id
			this.AttachmentId = reader.GetValue<@uuid>("AttachmentId", defaultValue: this.AttachmentId);
		}

		/// <summary>
		/// 将当前对象作为 JSON 字符串写入指定的文本流。
		/// </summary>
		/// <param name="writer">目标文本流。</param>
		/// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
		public override void Write(global::System.IO.TextWriter writer)
		{
			if (writer == null)
			{
				throw new global::System.ArgumentNullException("writer");
			}

			writer.Write('{');

			// Id
			writer.Write("\"id\":");
			this.Id.Write(writer);
			writer.Write(',');

			// 发送用户的 Id
			writer.Write("\"senderId\":");
			this.SenderId.Write(writer);
			writer.Write(',');

			// 接收用户的 Id
			writer.Write("\"receiverId\":");
			this.ReceiverId.Write(writer);
			writer.Write(',');

			// 接收人名称
			writer.Write("\"receiverName\":");
			this.ReceiverName.Write(writer);
			writer.Write(',');

			// 接收人头像路径
			writer.Write("\"receiverFaceUrl\":");
			this.ReceiverFaceUrl.Write(writer);
			writer.Write(',');

			// 接收时间
			writer.Write("\"receiveTime\":");
			this.ReceiveTime.Write(writer);
			writer.Write(',');

			// 阅读时间
			writer.Write("\"readTime\":");
			this.ReadTime.Write(writer);
			writer.Write(',');

			// 紧急程度
			writer.Write("\"urgency\":");
			this.Urgency.Write(writer);
			writer.Write(',');

			// 分组
			writer.Write("\"group\":");
			this.Group.Write(writer);
			writer.Write(',');

			// 通知标题
			writer.Write("\"title\":");
			this.Title.Write(writer);
			writer.Write(',');

			// 通知消息摘要
			writer.Write("\"summary\":");
			this.Summary.Write(writer);
			writer.Write(',');

			// 通知正文内容
			writer.Write("\"body\":");
			this.Body.Write(writer);
			writer.Write(',');

			// 正文类型代码
			writer.Write("\"bodyType\":");
			this.BodyType.Write(writer);
			writer.Write(',');

			// 目标功能路径
			writer.Write("\"funcUrl\":");
			this.FuncUrl.Write(writer);
			writer.Write(',');

			// 引用数据的类型
			writer.Write("\"refDataType\":");
			this.RefDataType.Write(writer);
			writer.Write(',');

			// 引用数据键值
			writer.Write("\"refDataKey\":");
			this.RefDataKey.Write(writer);
			writer.Write(',');

			// 附件 Id
			writer.Write("\"attachmentId\":");
			this.AttachmentId.Write(writer);

			writer.Write('}');
		}

		#endregion
	}
}
